/**
* Universidade de Brasilia
* 2013.1
* Trabalho de Programacao Orientada a Objetos
* Professor: Fernando Chacon
* Alunos
*   Lucas Lo Ami Alvino Silva - 09/0009886
*   Leonardo de Sousa Melo    - 08/34220
*
* @author Lucas Lo Ami
*/
#include "../include/Persistencia.h"

list<ElementoResultado> ComandoSQL::resultado;

//---------------------------------------------------------------------------
//Classe ErroPersistencia.

EErroPersistencia::EErroPersistencia(std::string mensagem){
        this->mensagem = mensagem;
}

std::string EErroPersistencia::oQue() {
        return mensagem;
}


//-------------------------------------------------------------------
/* Classe ElementoResultado */
void ElementoResultado::setNomeColuna(const std::string& nome_coluna)
{
    this->nome_coluna = nome_coluna;
}

void ElementoResultado::setValorColuna(const std::string& valor_coluna)
{
    this->valor_coluna = valor_coluna;
}

std::string ElementoResultado::getNomeColuna() const
{
    return nome_coluna;
}

std::string ElementoResultado::getValorColuna() const
{
    return valor_coluna;
}

//-------------------------------------------------------------------
/* Classe ComandoSQL */
ComandoSQL::ComandoSQL()
{
    nome_banco = "db_teste.db";
}

ComandoSQL::~ComandoSQL()
{
    //dtor
}

void ComandoSQL::conectar() throw (EErroPersistencia)
{
    rc = sqlite3_open(nome_banco, &bd);
    if( rc != SQLITE_OK )
        throw EErroPersistencia("Erro na conexao ao banco de dados");
}

void ComandoSQL::desconectar() throw (EErroPersistencia)
{
    rc =  sqlite3_close(bd);
    if( rc != SQLITE_OK )
        throw EErroPersistencia("Erro na desconexao ao banco de dados");
}

void ComandoSQL::executar() throw (EErroPersistencia)
{
    conectar();
    rc = sqlite3_exec(bd, comando_sql.c_str(), callback, 0, &mensagem);
    if(rc != SQLITE_OK){
        if (mensagem)
                free(mensagem);
        throw EErroPersistencia("Erro na execucao do comando SQL");
    }
    desconectar();
}

int ComandoSQL::callback(void *not_used, int argc, char **valor_coluna, char **nome_coluna)
{
    not_used = 0;
    ElementoResultado el;
    int i = 0;

    for (i = 0; i<argc; i++) {
        el.setNomeColuna(nome_coluna[i]);
        el.setValorColuna(valor_coluna[i] ? valor_coluna[i]: "NULL");
        resultado.push_front(el);
    }
    return 0;
}

//-------------------------------------------------------------------
/* Classe ComandoCriarAdministrador */
ComandoCriarAdministrador::ComandoCriarAdministrador(Administrador administrador)
{
    /*comando_sql = "INSERT INTO adminsitrador VALUES (";
    comando_sql += "'"+ administrador.getSenha()getInput() +"'";
    comando_sql += ")";*/
}

//-------------------------------------------------------------------
/* Classe ComandoCriarGerente */
ComandoCriarGerente::ComandoCriarGerente(Gerente gerente)
{
    /*comando_sql = "INSERT INTO gerente VALUES (";
    comando_sql += LISTAR OS ATRIBUTOS AQUI;
    comando_sql += ")";*/
}

//-------------------------------------------------------------------
/* Classe ComandoCriarConta */
ComandoCriarConta::ComandoCriarConta(Conta conta)
{
    /*comando_sql = "INSERT INTO conta VALUES (";
    comando_sql += LISTAR OS ATRIBUTOS AQUI;
    comando_sql += ")";*/
}

//-------------------------------------------------------------------
/* Classe ComandoAutenticarAdministrador */
ComandoAutenticarAdministrador::ComandoAutenticarAdministrador(Administrador administrador)
{
    comando_sql = "SELECT admin.* FROM administrador admin WHERE senha=";
    comando_sql += "'"+ administrador.getSenha().getInput() +"'";
    comando_sql += ")";
}

Administrador ComandoAutenticarAdministrador::getResultado() throw (EErroPersistencia)
{
    ElementoResultado retorno;
    Administrador administrador;
    //Senha senha;

    //Remover senha;
    if (resultado.empty())
        throw EErroPersistencia("Lista de resultados vazia.");
    retorno = resultado.back();
    resultado.pop_back();
    administrador.setSenha(Senha(retorno.getValorColuna() ));

    //administrador.setSenha(senha);
    // implementar
    return administrador;
}

//-------------------------------------------------------------------
/* Classe ComandoAutenticarGerente */
ComandoAutenticarGerente::ComandoAutenticarGerente(Gerente gerente)
{
    comando_sql = "SELECT ger.* FROM gerente ger WHERE matricula=";
    comando_sql += "'"+ gerente.getMatricula().getInput() +"' AND senha=";
    comando_sql += "'"+ gerente.getSenha().getInput() +"' AND";
    comando_sql += ")";

}

Gerente ComandoAutenticarGerente::getResultado() throw (EErroPersistencia)
{
    Gerente gerente;
    ElementoResultado retorno;

    //Remover senha;
    if (resultado.empty())
        throw EErroPersistencia("Lista de resultados vazia.");
    retorno = resultado.back();
    resultado.pop_back();
    gerente.setSenha(Senha(retorno.getValorColuna() ));

    //Remover nome
    if (resultado.empty())
        throw EErroPersistencia("Lista de resultados vazia.");
    retorno = resultado.back();
    resultado.pop_back();
    gerente.setNome(Nome(retorno.getValorColuna() ));

    //Remover matricula
    if (resultado.empty())
        throw EErroPersistencia("Lista de resultados vazia.");
    retorno = resultado.back();
    resultado.pop_back();
    gerente.setMatricula(Matricula(retorno.getValorColuna() ));


    return gerente;
}

//-------------------------------------------------------------------
/* Classe ComandoAutenticarGerente */
ComandoAutenticarConta::ComandoAutenticarConta(Conta conta)
{
    comando_sql = "SELECT con.* FROM conta con WHERE senha=";
    comando_sql += "'"+ conta.getNumeroConta().getInput() +"' AND senha=";
    comando_sql += "'"+ conta.getSenha().getInput() +"' AND";
    comando_sql += ")";

}

Conta ComandoAutenticarConta::getResultado() throw (EErroPersistencia)
{
    Conta conta;
    ElementoResultado retorno;

    //Remover senha;
    if (resultado.empty())
        throw EErroPersistencia("Lista de resultados vazia.");
    retorno = resultado.back();
    resultado.pop_back();
    conta.setSenha(Senha(retorno.getValorColuna() ));
	//TODO PARA RETORNAR NOME DO CLIENTE
    return conta;
}


//-------------------------------------------------------------------
/* Classe ComandoAlterarSenhaAdmin */
ComandoAlterarSenhaAdmin::ComandoAlterarSenhaAdmin(Administrador administrador)
{
    /*
    comando_sql = " UPDATE administrador SET";
    comando_sql += LISTA DE ATRIBUTOS;
    comando_sql += "WHERE TERMINAR SQL";

    */
}

//-------------------------------------------------------------------
/* Classe ComandoAlterarSenhaGerente */
ComandoAlterarSenhaGerente::ComandoAlterarSenhaGerente(Gerente gerente)
{
    /*
    comando_sql = " UPDATE gerente SET";
    comando_sql += LISTA DE ATRIBUTOS;
    comando_sql += "WHERE TERMINAR SQL";

    */
}

//-------------------------------------------------------------------
/* Classe ComandoAlterarSenhaConta */
ComandoAlterarSenhaConta::ComandoAlterarSenhaConta(Conta Conta)
{
    /*
    comando_sql = " UPDATE conta SET";
    comando_sql += LISTA DE ATRIBUTOS;
    comando_sql += "WHERE TERMINAR SQL";

    */
}


//-------------------------------------------------------------------
/* Classe ComandoListarGerentes */
ComandoListarGerentes::ComandoListarGerentes()
{
    /*
    comando_sql = "SELECT ger.* FROM gerente ger;
    */
}

std::list<Gerente> ComandoListarGerentes::getResultado() throw (EErroPersistencia)
{
    std::list<Gerente> lista;
    // implementar
    return lista;
}

//-------------------------------------------------------------------
/* Classe ComandoListarContas */
ComandoListarContas::ComandoListarContas()
{
    /*
    comando_sql = "SELECT con.* FROM conta con;
    */
}

std::list<Conta> ComandoListarContas::getResultado() throw (EErroPersistencia)
{
    std::list<Conta> lista;
    // implementar
    return lista;
}

//-------------------------------------------------------------------
/* Classe ComandoListarPagamentos */
ComandoListarPagamentos::ComandoListarPagamentos(Conta conta)
{
    /*
    comando_sql = "SELECT pag.* FROM pagamento pag;
    */
}

std::list<Pagamento> ComandoListarPagamentos::getResultado() throw (EErroPersistencia)
{
    std::list<Pagamento> lista;
    // implementar
    return lista;
}

//-------------------------------------------------------------------
/* Classe ComandoListarDadosGerente */
ComandoPegarGerente::ComandoPegarGerente(Gerente gerente)
{
    /*
    comando_sql = "SELECT ger.* FROM gerente ger WHERE ";
    */
}

Gerente ComandoPegarGerente::getResultado() throw (EErroPersistencia)
{
    Gerente gerente;
    // implementar
    return gerente;
}

//-------------------------------------------------------------------
/* Classe ComandoListarDadosConta */
ComandoPegarConta::ComandoPegarConta(Conta conta)
{
    /*
    comando_sql = "SELECT con.* FROM conta con WHERE ";
    */
}

Conta ComandoPegarConta::getResultado() throw (EErroPersistencia)
{
    Conta conta;
    // implementar
    return conta;
}

//-------------------------------------------------------------------
/* Classe ComandoPegarAdmin */
ComandoPegarAdministrador::ComandoPegarAdministrador(Administrador admin)
{
    /*
    comando_sql = "SELECT con.* FROM conta con WHERE ";
    */
}

Administrador ComandoPegarAdministrador::getResultado() throw (EErroPersistencia)
{
    Administrador admin;
    // implementar
    return admin;
}

//-------------------------------------------------------------------
/* Classe ComandoAlterarDadosGerente */
ComandoAlterarDadosGerente::ComandoAlterarDadosGerente(Gerente gerente)
{
    /*
    comando_sql = " UPDATE gerente SET";
    comando_sql += LISTA DE ATRIBUTOS;
    comando_sql += "WHERE TERMINAR SQL";

    */
}

//-------------------------------------------------------------------
/* Classe ComandoAlterarDadosConta */
ComandoAlterarDadosConta::ComandoAlterarDadosConta(Conta conta)
{
    /*
    comando_sql = " UPDATE conta SET";
    comando_sql += LISTA DE ATRIBUTOS;
    comando_sql += "WHERE TERMINAR SQL";

    */
}

//-------------------------------------------------------------------
/* Classe ComandoRemoverGerente */
ComandoRemoverGerente::ComandoRemoverGerente(Gerente gerente)
{
    /*
    comando_sql = " DELETE FROM gerente WHERE matricula = TERMINAR QUERY";

    */
}

//-------------------------------------------------------------------
/* Classe ComandoFecharConta */
ComandoFecharConta::ComandoFecharConta(Conta conta)
{
    /*
    comando_sql = " DELETE FROM conta WHERE conta = TERMINAR QUERY";
    */
}

//-------------------------------------------------------------------
/* Classe ComandoBloquearConta */
ComandoBloquearConta::ComandoBloquearConta(Conta conta)
{
    /*
    comando_sql = " UPDATE conta SET LISTAR ATRIBUTOS WHERE conta = TERMINAR QUERY";
    */
}

//-------------------------------------------------------------------
/* Classe ComandoDesbloquearConta */
ComandoDesbloquearConta::ComandoDesbloquearConta(Conta conta)
{
    /*
    comando_sql = " UPDATE conta SET LISTAR ATRIBUTOS WHERE conta = TERMINAR QUERY";
    */
}

//-------------------------------------------------------------------
/* Classe ComandoConsultarSaldo */
ComandoConsultarSaldo::ComandoConsultarSaldo(Conta conta)
{
    /*
    comando_sql = "SELECT con.saldo FROM conta con WHERE TERMINAR SQL";
    */
}

float ComandoConsultarSaldo::getResultado() throw (EErroPersistencia)
{
    // implementar
    return 1.0;
}

//-------------------------------------------------------------------
/* Classe ComandoSaque */
ComandoSaque::ComandoSaque(Conta conta)
{
    /*
    comando_sql = " UPDATE conta SET LISTAR ATRIBUTOS WHERE conta = TERMINAR QUERY";
    */
}

//-------------------------------------------------------------------
/* Classe ComandoDeposito */
ComandoDeposito::ComandoDeposito(Conta conta)
{
    /*
    comando_sql = " UPDATE conta SET LISTAR ATRIBUTOS WHERE conta = TERMINAR QUERY";
    */
}

//-------------------------------------------------------------------
/* Classe ComandoAgendarPagamento */
ComandoAgendarPagamento::ComandoAgendarPagamento(Pagamento pag, Conta conta)
{
    /*
    comando_sql = " INSERT INTO ...";
    */
}

//-------------------------------------------------------------------
/* Classe ComandoCancelarPagamento */
ComandoCancelarPagamento::ComandoCancelarPagamento(Pagamento pagamento, Conta conta)
{
    /*
    comando_sql = " DELETE FROM pagamento ...";
    */
}
